#include "ManejadorAdministrador.h"
using namespace Manejadores;

ManejadorAdministrador::ManejadorAdministrador() {
	Configuracion* config = config->getInstancia();
	string pathDeDatos = config->getNombreArchivoAdministrador();
	this->administrador = new ArchivoDeEstructurasVariables(pathDeDatos);
	this->indicePorUnicidad = new HashExtensible("IndicePorUnicidadAdmin");
}

bool ManejadorAdministrador::existe(string usuarioAdmin) {
	return this->indicePorUnicidad->existe(Utils::aMinuscula(usuarioAdmin));
}

Administrador* ManejadorAdministrador::recuperar(string usuarioAdmin) {

	usuarioAdmin = Utils::aMinuscula(usuarioAdmin);
	Log* log = Log::getInstancia();
	IRegistroIndice* registro = this->indicePorUnicidad->buscar(usuarioAdmin);
	if (registro->getOffsets()->size() > 0) {
		Administrador* admin = new Administrador();
		administrador->leer(admin, registro->getOffsets()->at(0));
		log->escribir("Administrador existente.");
		delete registro;
		return admin;
	} else {
		log->escribir("Usuario de administrador incorrecto.");
		return NULL;
	}
}

bool ManejadorAdministrador::alta(Administrador* admin) {
	string clavePorUnicidad = admin->getUsuario();
	if (!indicePorUnicidad->existe(clavePorUnicidad)) {
		unsigned int posicionDelRegistro = administrador->insertar(admin);
		indicePorUnicidad->insertar(clavePorUnicidad, posicionDelRegistro);
		indicePorUnicidad->exportarTxt("IndicePorUnicidadAdmin");
		return true;
	} else
		return false;
}

bool ManejadorAdministrador::baja(Administrador* admin) {
	string clavePorUnidicidad = admin->getUsuario();
	IRegistroIndice* aBorrar = indicePorUnicidad->buscar(clavePorUnidicidad);
	if (aBorrar->getOffsets()->size() > 0) {
		administrador->borrar(admin, aBorrar->getOffsets()->at(0));
		indicePorUnicidad->eliminar(clavePorUnidicidad, aBorrar->getOffsets()->at(0));
		indicePorUnicidad->exportarTxt("IndicePorUnicidadAdmin");
		delete aBorrar;
		return true;
	} else {
		delete aBorrar;
		return false;

	}
}

bool ManejadorAdministrador::noHayUsuariosAdmin(){
	return this->administrador->estaVacio();
}

ManejadorAdministrador::~ManejadorAdministrador() {
	delete this->administrador;
	delete this->indicePorUnicidad;
}
